/*
 * NetworkServer.h
 * 
 * 网络服务器 - 封装 muduo TcpServer
 * 提供会话管理和消息回调
 */

#pragma once

#include "network/Session.h"
#include "network/SessionManager.h"

#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/base/noncopyable.h>

#include <functional>
#include <memory>

namespace framework {

/**
 * @brief 网络服务器回调类型
 */
typedef std::function<void(const SessionPtr&)> SessionCallback;
typedef std::function<void(const SessionPtr&, muduo::net::Buffer*, muduo::Timestamp)> SessionMessageCallback;

/**
 * @brief 网络服务器 - 对 TcpServer 的封装
 * 
 * 职责：
 * 1. 管理网络连接
 * 2. 自动创建和销毁 Session
 * 3. 提供会话级别的回调接口
 */
class NetworkServer : muduo::noncopyable {
public:
    NetworkServer(muduo::net::EventLoop* loop,
                  const muduo::net::InetAddress& listenAddr,
                  const std::string& name);
    ~NetworkServer();
    
    // 设置线程数（0 表示单 Reactor，>0 表示多 Reactor）
    void setThreadNum(int numThreads);
    
    // 启动服务器
    void start();
    
    // 设置回调
    void setSessionConnectedCallback(const SessionCallback& cb) {
        sessionConnectedCallback_ = cb;
    }
    
    void setSessionDisconnectedCallback(const SessionCallback& cb) {
        sessionDisconnectedCallback_ = cb;
    }
    
    void setSessionMessageCallback(const SessionMessageCallback& cb) {
        sessionMessageCallback_ = cb;
    }
    
    // 发送消息
    void send(uint64_t sessionId, const std::string& data);
    void send(uint64_t sessionId, const void* data, size_t len);
    
    // 广播消息
    void broadcast(const std::string& data);
    void broadcast(const void* data, size_t len);
    
    // 关闭会话
    void closeSession(uint64_t sessionId);
    
    // 获取会话
    SessionPtr getSession(uint64_t sessionId);
    
    // 获取会话管理器
    SessionManager& sessionManager() { return sessionManager_; }
    const SessionManager& sessionManager() const { return sessionManager_; }
    
private:
    // muduo 回调
    void onConnection(const muduo::net::TcpConnectionPtr& conn);
    void onMessage(const muduo::net::TcpConnectionPtr& conn,
                   muduo::net::Buffer* buf,
                   muduo::Timestamp time);
    
    muduo::net::EventLoop* loop_;
    std::unique_ptr<muduo::net::TcpServer> server_;
    SessionManager sessionManager_;
    
    // 用户回调
    SessionCallback sessionConnectedCallback_;
    SessionCallback sessionDisconnectedCallback_;
    SessionMessageCallback sessionMessageCallback_;
};

} // namespace framework

